package com.tool.cn.use;

import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 文件修改监听工具类，监听文件，修改后执行方法
 * @author wangzh
 * @date 2019年12月18日 下午4:29:03
 */
public class FileChangeUse extends Thread {
	
	private static Logger log = LoggerFactory.getLogger(FileChangeUse.class);

	/**
	 * 监听路径
	 */
	private String path;
	/**
	 * 监听文件名
	 */
	private String fileName;
	
	/**
	 * 文件
	 */
	private File file;

	@SuppressWarnings("unused")
	private FileChangeUse() {}
	
	/**
	 * 初始化
	 * @param path 文件路径
	 * @param fileName 文件名
	 */
	public FileChangeUse(String path, String fileName) {
		this.fileName = fileName;
		this.path = path;
		this.file=new File(this.path+File.separator+this.fileName);
	}
	
	/**
	 * 初始化
	 * @param fileString 物理路径文件
	 */
	public FileChangeUse(String fileString) {
		file= new File(fileString);
		this.path = file.getParent();
		this.fileName = file.getName();
	}

	@Override
	public void run() {
		log.info("Start Listen File:"+this.file);
		Path p = Paths.get(path);
		try {
			WatchService watchService = FileSystems.getDefault().newWatchService();
			p.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE,
					StandardWatchEventKinds.ENTRY_CREATE);
			long size;
			while (true) {
				WatchKey watchKey = watchService.take();
				for (WatchEvent<?> event : watchKey.pollEvents()) {
					WatchEvent.Kind<?> kind = event.kind();

					// 创建事件
					if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
						break;
					}
					// 修改事件
					if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
						if(event.context().toString().equals(fileName)){
							size=this.file.length();
							if(size>0L){  //文件大小大于0时做操作
								log.info(this.file+" Have Change ");
								//TODO 要执行操作
							}
						}
						
					}
					// 删除事件
					if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
						break;
					}
					
				}
				watchKey.reset();
			}

		} catch (Exception e) {
			log.error(e.toString(), e);
		}
	}

}
